#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/fs.h>        // 包含 struct inode 和 struct file 定义
#include <linux/cdev.h>      // 字符设备相关
#include <linux/uaccess.h>   // 包含 copy_from_user 声明
#include <linux/device.h>   // 包含 class_create 和 device_create 的声明
#include <asm/io.h>

/********导出总线属性文件*******/
static char *bus_name = "hello, xbus";
ssize_t xbus_test_show(struct bus_type *bus, char *buf)
{
    return sprintf(buf, "%s\n", bus_name);
}

BUS_ATTR(xbus_test, S_IRUSR, xbus_test_show, NULL);
/********************/

/********定义新的总线************/
int xbus_match(struct device *dev, struct device_driver *drv)
{
    printk("%s-%s\n",__FILE__, __func__);
    if(!strncmp(dev_name(dev), drv->name, strlen(drv->name)))
	{
        printk("dev & drv match\n");
        return 1;
    }
    return 0;
}

static struct bus_type xbus = 
{
    .name = "xbus",
    .match = xbus_match,
};
EXPORT_SYMBOL(xbus);
/********************/

static __init int xbus_init(void)
{
    printk("xbus init\n");

    bus_register(&xbus);
    bus_create_file(&xbus, &bus_attr_xbus_test);
    return 0;
}
module_init(xbus_init);


static __exit void xbus_exit(void)
{
    printk("xbus exit\n");
    bus_remove_file(&xbus, &bus_attr_xbus_test);
    bus_unregister(&xbus);
}
module_exit(xbus_exit);



MODULE_LICENSE("GPL");
MODULE_AUTHOR("embedfire ");
MODULE_DESCRIPTION("hello module");
MODULE_ALIAS("test_module");

